package com.curricula.curriculum.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.curricula.curriculum.vo.PersonalVO;

/**
 * Clase para la el acceso a datos querys: insert, update, select y delete.
 * 
 * @author Hugo
 * @version 1.0
 * 
 */
public class PersonalDAO {
	static Logger log = Logger.getLogger(PersonalDAO.class);
	
	/**
	 * Ejecucion del query con la sentencia INSERT invocada por el servicio PersonalService
	 * 
	 * @author Hugo
	 * @param AficionVO aficionVO
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean insert(PersonalVO personalVO, Connection conn) throws SQLException{
		boolean insertado = false;
		PreparedStatement ps=null;
		String sql = "INSERT INTO personal (per_id, per_nombre, per_paterno, per_materno, per_edad, per_fnacimiento, per_sexo, per_edocivil)"
					+ "VALUES (?,?,?,?,?,?,?,?)";
		int i=1, rows;
		try{
			ps = conn.prepareStatement(sql);
			ps.setString(i++, String.valueOf(personalVO.getId()));
			ps.setString(i++, personalVO.getNombre());
			ps.setString(i++, personalVO.getApellidoPaterno());
			ps.setString(i++, personalVO.getApellidoMaterno());
			ps.setString(i++, String.valueOf(personalVO.getEdad()));
			ps.setString(i++, personalVO.getFechaNacimiento());
			ps.setString(i++, personalVO.getSexo());
			ps.setString(i++, personalVO.getEdoCivil());
			
			log.info("Consulta insert: "+ sql);
			rows = ps.executeUpdate();
			
			if(rows>0){
				log.info("Insertados: "+ rows+ " registros");
				insertado = true;				
			}else{
				log.error("No se pudieron insertar los registros");
			}			
		}catch (SQLException e) {
			log.error("Fallo en la ejecucion de la consulta: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return insertado;		
	}
	
	/**
	 * Ejecucion del query con la sentencia UPDATE invocada por el servicio PersonalService
	 * se invoca con un parametro valor que tiene el nuevo VO a actualizar y un filtro
	 * que es el que cumplira la clausula de update.
	 * 
	 * @author Hugo
	 * @param AficionVO valor
	 * @param AficionVO filtro
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static boolean update(PersonalVO personalVO, Connection conn)throws SQLException{
		boolean actualizado = false;
		int i=1, rows;
		String sql="UPDATE personal SET per_nombre=?, per_paterno=?, per_materno=?, per_edad=?, per_fnacimiento=?, per_sexo=?, per_edocivil=? WHERE per_id=?";
		PreparedStatement ps = null;		
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(i++, personalVO.getNombre());
			ps.setString(i++, personalVO.getApellidoPaterno());
			ps.setString(i++, personalVO.getApellidoMaterno());
			ps.setString(i++, String.valueOf(personalVO.getEdad()));
			ps.setString(i++, personalVO.getFechaNacimiento());
			ps.setString(i++, personalVO.getSexo());
			ps.setString(i++, personalVO.getEdoCivil());
			ps.setString(i++, String.valueOf(personalVO.getId()));
			
			rows = ps.executeUpdate();
			log.info("Consulta update: "+ sql);
			
			if(rows>0){
				log.info("Actualizados "+ rows + " registros");
				actualizado = true;
			}
			else
				log.error("No se actualizo ningun registro");
		} catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return actualizado;
	}
	
	/**
	 * Ejecucion del query con la sentencia SELECT invocada por el servicio PersonalService,
	 * se invoca con un Vo que servira de filtro para obtener una lista con todos los elementos
	 * que cumplan la clausula del VO filtro.
	 * 
	 * @author Hugo
	 * @param AficionVO aficion
	 * @param Connection conn
	 * @return boolean
	 * @throws SQLException 
	 */
	public static List<PersonalVO> find(PersonalVO personal, Connection conn)throws SQLException{
		List<PersonalVO> listaPersonal = new ArrayList<PersonalVO>();
		int cont = 0;
		PreparedStatement ps = null;
		String sql ="SELECT * FROM personal WHERE 1=1";
		
		if(personal.getId()>0)
			sql+=" AND per_id ="+ personal.getId();
		if(personal.getApellidoMaterno()!= null && !personal.getApellidoMaterno().equalsIgnoreCase(""))
			sql+=" AND per_materno ='"+ personal.getApellidoMaterno()+"'";
		if(personal.getApellidoPaterno()!= null && !personal.getApellidoPaterno().equalsIgnoreCase(""))
			sql+=" AND per_paterno ='"+ personal.getApellidoPaterno()+"'";
		if(personal.getEdad()>0)
			sql+=" AND per_edad ="+ personal.getEdad();
		if(personal.getFechaNacimiento()!= null && !personal.getFechaNacimiento().equalsIgnoreCase(""))
			sql+=" AND per_fnacimiento ='"+ personal.getFechaNacimiento()+"'";
		if(personal.getNombre()!= null && !personal.getNombre().equalsIgnoreCase(""))
			sql+=" AND per_nombre ='"+ personal.getNombre()+"'";
		if(personal.getSexo()!= null && !personal.getSexo().equalsIgnoreCase(""))
			sql+=" AND per_sexo ='"+ personal.getSexo()+"'";
		if(personal.getEdoCivil()!= null && !personal.getEdoCivil().equalsIgnoreCase(""))
			sql+=" AND per_edocivil ='"+ personal.getEdoCivil()+"'";
				
		log.info("Consulta Find: "+ sql);		
		try {
			ps = conn.prepareStatement(sql);			
			ResultSet rs = ps.executeQuery();			
			while(rs.next()){
				cont++;
				PersonalVO encontrado = new PersonalVO();
				encontrado.setId(rs.getInt("per_id"));
		    	encontrado.setNombre(rs.getString("per_nombre"));
		    	encontrado.setApellidoPaterno(rs.getString("per_paterno"));
		    	encontrado.setApellidoMaterno(rs.getString("per_materno"));
		    	encontrado.setEdad(rs.getInt("per_edad"));
		    	encontrado.setFechaNacimiento(rs.getString("per_fnacimiento"));
		    	encontrado.setSexo(rs.getString("per_sexo"));
		    	encontrado.setEdoCivil(rs.getString("per_edocivil"));
		    	listaPersonal.add(encontrado);
			}			
			if(cont==0)
				return null;
			
		}catch (SQLException e) {
			log.error("Error SQL: "+ e);
			throw e;
		}finally{
			if(ps!=null)
				try {
					ps.close();
				} catch (SQLException e) {
					log.error("Fallo en el cierre de la ps: "+e);
					throw e;
				}
		}
		return listaPersonal;		
	}
}
